/* eslint-disable import/no-dynamic-require */
/* eslint-disable global-require */
const program = require('commander');
const path = require('path');
const { version } = require('./constans');

const mapAction = {
  create: {
    // 创建模板
    alias: 'c', // 配置命令的别称
    description: 'create a project', // 命令相对应的描述
    examples: ['xb-cli create <project-name>'],
  },
  config: {
    // 配置文件
    alias: 'conf',
    description: 'config project variable',
    examples: ['xb-cli config set <k> <v>', 'xb-cli config get <k>'],
  },
  '*': {
    // 根据自己的情况配置别的命令
    alias: '',
    description: 'command not found',
    examples: [],
  },
};

Reflect.ownKeys(mapAction).forEach((action) => {
  program
    .command(action) // 配置命令的名字
    .alias(mapAction[action].alias) // 命令别的名称
    .description(mapAction[action].description) // 命令对应的描述
    .action(() => {
      if (action === '*') {
        // 访问不到对应的命令 就打印找不到命令
        console.log(mapAction[action].description);
      } else {
        console.log(action);
        // 运行xb-cli create xxx  解析后是[node , xb-cli  , create  , xxx]
        const actionFilename = path.resolve(__dirname, action);
        require(actionFilename)(...process.argv.slice(3));
      }
    });
});
// 用户监听help事件打印出信息  运行xb-cli --help
program.on('--help', () => {
  console.log('\r\nExamples:');
  Reflect.ownKeys(mapAction).forEach((action) => {
    mapAction[action].examples.forEach((example) => {
      console.log(`   ${example}`);
    });
  });
});

// 运行xb-cli --version结果为当前的版本
// 解析用户传过来的参数  xb-cli --help 运行出来结果
program.version(version).parse(process.argv);
